国际化项目中 ICU 是什么

December 06, 2024

国际化(i18n)和本地化(l10n) 开发中,ICU(International Components for Unicode) 是一个由 Unicode 联盟维护的开源库,提供了一套强大的工具来处理多语言文本、日期时间、数字格式化、复数规则、性别敏感文本等国际化需求。ICU 是许多操作系统(如 Android、iOS、Linux)和编程语言(如 Java、C/C++、Python)的底层国际化支持库。

ICU 的核心功能

ICU 的主要功能包括:

1. 文本格式化与解析

  • 数字格式化(货币、百分比、科学计数法等)
    // 示例:格式化货币(美元)
    NumberFormat.getCurrencyInstance(Locale.US).format(1234.56)"$1,234.56"
  • 日期时间格式化(支持不同历法,如公历、农历、伊斯兰历等)
// 示例:格式化日期(法语)
    SimpleDateFormat("EEEE, d MMMM y", Locale.FRANCE).format(new Date())"lundi, 19 mai 2025"

2. 字符串比较与排序(排序规则)

  • 支持语言敏感的字符串排序(如德语 ä 排序规则不同于英语 a)。
  • Unicode 规范化(Normalization),处理变音符号(如 é vs. )。

3. 字符编码转换

  • 支持 UTF-8、UTF-16、GB2312 等多种编码转换,确保文本在不同编码环境下的正确显示。

4. 复数规则(Plural Rules)

  • 不同语言的复数形式不同(如英语 1 book vs. 2 books,俄语有更复杂的规则)。
// 示例:俄语复数规则
"You have {count, plural, one {# книга} few {# книги} many {# книг}}"

5. 性别敏感文本(Gender-aware Formatting)

  • 某些语言(如法语、阿拉伯语)的文本会根据性别变化。
    // 示例:法语("Vous êtes connecté(e)")
    MessageFormat.format("Vous êtes connecté{0}", gender == FEMALE ? "(e)" : "");

6. 断行(Line Breaking)和文本边界检测

  • 支持中文、日文等无空格语言的分词(Word Break)
  • 换行规则(如 CJK 文本的换行策略)

7. 时区和国际化日历

  • 支持全球时区转换(如 America/New_York vs. Asia/Shanghai)。
  • 非公历日历(如希伯来历、伊斯兰历)的日期计算。

前端(Web)的 ICU 实现

** i18next + 插件**

  • GitHubi18next Plugin
  • 特点
    • 支持 ICU 消息格式({count, plural, one {...} other {...}})。
    • 与 React/Vue/Angular 深度集成(react-i18next)。
    • 扩展性强,支持后端动态加载翻译文件。
  • 示例(React + ICU 复数规则)
import i18next from 'i18next';
import ICU from 'i18next-icu';

// ICU 语言规则(可选,默认已内置常见语言)
import en from 'i18next-icu/locale-data/en';
import zh from 'i18next-icu/locale-data/zh';

i18next
  .use(new ICU({ localeData: [en, zh] })) // 加载 ICU 插件
  .init({
    lng: 'en', // 默认语言
    resources: {
      en: {
        translation: {
          // ICU 格式的翻译键值
          greeting: "Hello, {name}!",
          items: "{count, plural, one {# item} other {# items}}",
          date: "Today is {date, date, short}",
          gender: "{gender, select, male {He} female {She} other {They}} likes this."
        }
      },
      zh: {
        translation: {
          greeting: "你好,{name}!",
          items: "{count, plural, other {# 个物品}}",
          date: "今天是 {date, date, short}",
          gender: "{gender, select, male {他} female {她} other {他们}}喜欢这个。"
        }
      }
    }
  });

### **(1) 复数规则(Pluralization)**
// 英文:根据 count 返回不同复数形式
t('items', { count: 1 }); // "1 item"
t('items', { count: 5 }); // "5 items"
// 中文:中文复数通常只有一种形式
t('items', { count: 5 }); // "5 个物品"

### **(2) 性别敏感文本(Gender)**

t('gender', { gender: 'male' });   // "He likes this." / "他喜欢这个。"
t('gender', { gender: 'female' }); // "She likes this." / "她喜欢这个。"

### **(3) 日期/时间格式化**

t('date', { date: new Date() }); 
// 英文: "Today is 5/20/2025"
// 中文: "今天是 2025/5/20"

### **(4) 数字格式化(货币、百分比等)**

// 需要在翻译键值中定义格式
{
  price: "Price: {value, number, ::currency/USD}"
}

t('price', { value: 1234.56 }); // "Price: $1,234.56"

与普通 i18next 的区别

特性 普通 i18next i18next + ICU
复数规则 仅基础(_plural 完整 ICU 复数(one/few/many
性别/选择语法 不支持 支持 {gender, select, ...}
日期/数字格式化 需手动处理 内置 {date, date, short}
灵活性 简单场景 复杂国际化需求